<?php

namespace Sistema\AdminBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Pagerfanta\Pagerfanta;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Pagerfanta\View\TwitterBootstrapView;

use Sistema\AdminBundle\Entity\Fecha;
use Sistema\AdminBundle\Form\FechaType;
use Sistema\AdminBundle\Form\FechaFilterType;

use Sistema\AdminBundle\Entity\Partido;
use Sistema\AdminBundle\Entity\PartidoDeEquipo;

/**
 * Fecha controller.
 *
 * @Route("/fecha")
 */
class FechaController extends Controller
{
    /**
     * Lists all Fecha entities.
     *
     * @Route("/", name="fecha")
     * @Template()
     */
    public function indexAction()
    {
        list($filterForm, $queryBuilder) = $this->filter();

        list($entities, $pagerHtml) = $this->paginator($queryBuilder);

    
        return array(
            'entities' => $entities,
            'pagerHtml' => $pagerHtml,
            'filterForm' => $filterForm->createView(),
        );
    }

    /**
    * Create filter form and process filter request.
    *
    */
    protected function filter()
    {
        $request = $this->getRequest();
        $session = $request->getSession();
        $filterForm = $this->createForm(new FechaFilterType());
        $em = $this->getDoctrine()->getManager();
        $queryBuilder = $em->getRepository('SistemaAdminBundle:Fecha')->createQueryBuilder('e');
    
        // Reset filter
        if ($request->getMethod() == 'POST' && $request->get('filter_action') == 'reset') {
            $session->remove('FechaControllerFilter');
        }
    
        // Filter action
        if ($request->getMethod() == 'POST' && $request->get('filter_action') == 'filter') {
            // Bind values from the request
            $filterForm->bind($request);

            if ($filterForm->isValid()) {
                // Build the query from the given form object
                $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($filterForm, $queryBuilder);
                // Save filter to session
                $filterData = $filterForm->getData();
                $session->set('FechaControllerFilter', $filterData);
            }
        } else {
            // Get filter from session
            if ($session->has('FechaControllerFilter')) {
                $filterData = $session->get('FechaControllerFilter');
                $filterForm = $this->createForm(new FechaFilterType(), $filterData);
                $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($filterForm, $queryBuilder);
            }
        }
    
        return array($filterForm, $queryBuilder);
    }

    /**
    * Get results from paginator and get paginator view.
    *
    */
    protected function paginator($queryBuilder)
    {
        // Paginator
        $adapter = new DoctrineORMAdapter($queryBuilder);
        $pagerfanta = new Pagerfanta($adapter);
        $currentPage = $this->getRequest()->get('page', 1);
        $pagerfanta->setCurrentPage($currentPage);
        $entities = $pagerfanta->getCurrentPageResults();
    
        // Paginator - route generator
        $me = $this;
        $routeGenerator = function($page) use ($me)
        {
            return $me->generateUrl('fecha', array('page' => $page));
        };
    
        // Paginator - view
        $translator = $this->get('translator');
        $view = new TwitterBootstrapView();
        $pagerHtml = $view->render($pagerfanta, $routeGenerator, array(
            'proximity' => 3,
            'prev_message' => $translator->trans('views.index.pagprev', array(), 'JordiLlonchCrudGeneratorBundle'),
            'next_message' => $translator->trans('views.index.pagnext', array(), 'JordiLlonchCrudGeneratorBundle'),
        ));
    
        return array($entities, $pagerHtml);
    }
    
    /**
     * Finds and displays a Fecha entity.
     *
     * @Route("/{id}/show", name="fecha_show")
     * @Template()
     */
    public function showAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('SistemaAdminBundle:Fecha')->find($id);
        $partidos = $em->getRepository('SistemaAdminBundle:Fecha')->findPartidosByFecha($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Fecha entity.');
        }

        $deleteForm = $this->createDeleteForm($id);

        return array(
            'entity'      => $entity,
            'delete_form' => $deleteForm->createView(),
            'partidos'    => $partidos,
        );
    }

    /**
     * Displays a form to create a new Fecha entity.
     *
     * @Route("/new", name="fecha_new")
     * @Template()
     */
    public function newAction()
    {
        $entity = new Fecha();
        $form   = $this->createForm(new FechaType(), $entity);

        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }

    /**
     * Creates a new Fecha entity.
     *
     * @Route("/create", name="fecha_create")
     * @Method("post")
     * @Template("SistemaAdminBundle:Fecha:new.html.twig")
     */
    public function createAction()
    {
        $entity  = new Fecha();
        $request = $this->getRequest();
        $form    = $this->createForm(new FechaType(), $entity);
        $form->bind($request);

        if ($form->isValid()) {
//            $em = $this->getDoctrine()->getManager();
//            $em->persist($entity);
//            $em->flush();

//            return $this->redirect($this->generateUrl('fecha_show', array('id' => $entity->getId())));
            $generarPartido = $this->generarPartido($entity);
            if ($generarPartido['control']) {
                $id = $generarPartido['fecha'];
                return $this->redirect($this->generateUrl('fecha_show', array('id' => $id)));//exito voy al show de fecha
            }  else {
                return $this->redirect($this->generateUrl('fecha'));//si no son par vuelvo al index fecha
            }
        }

        return array(
            'entity' => $entity,
            'form'   => $form->createView(),
        );
    }

    /**
     * Displays a form to edit an existing Fecha entity.
     *
     * @Route("/{id}/edit", name="fecha_edit")
     * @Template()
     */
    public function editAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('SistemaAdminBundle:Fecha')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Fecha entity.');
        }

        $editForm = $this->createForm(new FechaType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        );
    }

    /**
     * Edits an existing Fecha entity.
     *
     * @Route("/{id}/update", name="fecha_update")
     * @Method("post")
     * @Template("SistemaAdminBundle:Fecha:edit.html.twig")
     */
    public function updateAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('SistemaAdminBundle:Fecha')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Fecha entity.');
        }

        $editForm   = $this->createForm(new FechaType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        $request = $this->getRequest();

        $editForm->bind($request);

        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('fecha_edit', array('id' => $id)));
        }

        return array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        );
    }

    /**
     * Deletes a Fecha entity.
     *
     * @Route("/{id}/delete", name="fecha_delete")
     * @Method("post")
     */
    public function deleteAction($id)
    {
        $form = $this->createDeleteForm($id);
        $request = $this->getRequest();

        $form->bind($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $entity = $em->getRepository('SistemaAdminBundle:Fecha')->find($id);

            if (!$entity) {
                throw $this->createNotFoundException('Unable to find Fecha entity.');
            }

            $em->remove($entity);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('fecha'));
    }

    private function createDeleteForm($id)
    {
        return $this->createFormBuilder(array('id' => $id))
            ->add('id', 'hidden')
            ->getForm()
        ;
    }
    
    private function generarPartido($fecha) {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('SistemaAdminBundle:PartidoDeEquipo')->findEquiposDeGrupo($fecha->getIdGrupo());
        $cancha = $em->getRepository('SistemaAdminBundle:Cancha')->findAll();//obtengo las canchas
        $arbitro = $em->getRepository('SistemaAdminBundle:Arbitro')->findAll();
//        $fecha = $em->getRepository('SistemaAdminBundle:Fecha')->find($id);
        $cantidadEquipos = count($entity);
        $cantidadCanchas = count($cancha);
        $cantidadArbitros = count($arbitro);
        if ($cantidadArbitros != 0) {
            if ($cantidadCanchas != 0) {
                if ($cantidadEquipos != 0) {
                    $equiposImpar = $cantidadEquipos % 2;// si hay cantidad de equipos impar obtengo 1
                    if (!$equiposImpar) {//si tengo 0 osea cantidad de equipos par entra
                        $em->persist($fecha);//guardo la fecha que viene del create
                        $em->flush();//flushhhhhhh
                        $equipos = $entity;//hay que ver como desordenar los equipos
                        $idCancha = 0;//hay que ver como desordenar las canchas
                        $idArbitro = 0;//hay que ver como desordenar los arbitros
                        foreach ($equipos as $key => $equipo) {
                            if (!($key % 2)) {//si es par entra
                                if ($key != 0) {// si es 0 no entra porque es el primero y no puede persistir nada.
                                    $em->persist($partido);
                                    $em->persist($equipo1);
                                    $em->persist($equipo2);
                                }
                                if ($idCancha > $cantidadCanchas) {//si se supero la cantidad de cancha comienza devuelta cancha 0
                                    $idCancha = 0;
                                }
                                if ($idArbitro > $cantidadArbitros) {//si se supero la cantidad de arbitros comienza devuelta arbitro 0
                                    $idArbitro = 0;
                                }
                                $partido = new Partido;//nuevo partido
                                $partido->setIdFecha($fecha);
                                $partido->setIdCancha($cancha[0]);//una cancha de 0 hasta la cantidad total de canchas
                                $partido->addIdArbitro($arbitro[0]);//un arbitro de 0 hasta la cantidad total de arbitros
                                $partido->setFecha(new \DateTime());
                                $partido->setHorario(new \DateTime());

                                $equipo1 = new PartidoDeEquipo;//equipo 1
                                $equipo1->setIdPartido($partido);
                                $equipo1->setIdEquipo($equipo);
                            }  else {
                                $equipo2 = new PartidoDeEquipo;//equipo 2
                                $equipo2->setIdPartido($partido);
                                $equipo2->setIdEquipo($equipo);
                                $idCancha++;//cambio cancha para el proximo partidos
                            }
                        }
                        $em->persist($partido);//persisto los ultimos cambios
                        $em->persist($equipo1);
                        $em->persist($equipo2);
                        $em->flush();//guardo en la BD
                        $id = $fecha->getId();
                        $this->get('session')->setFlash('success', 'Se ha creado la fecha con los partidos para el grupo - torneo.');//mensaje flash al usuario
                        return array(//EXITO DEVUELVO TRUE
                            'control' => true,
                            'fecha' => $id
                            );
                    }  else {
                        $this->get('session')->setFlash('warning', 'La cantidad de clubes en el grupo - torneo debe ser par.');//mensaje flash al usuario
                        return false;//la cantidad de equipos es impar
                    }
                }
                $this->get('session')->setFlash('warning', 'El grupo - torneo no tiene equipos inscriptos.');//mensaje flash al usuario
                return false;//el grupo del torneo no tiene equipos
            }
            $this->get('session')->setFlash('warning', 'No se ha encontrado una cancha disponible.');//mensaje flash al usuario
            return false;//no hay una cancha
        }
        $this->get('session')->setFlash('warning', 'No se ha encontrado un arbitro disponible.');//mensaje flash al usuario
        return false;//no hay arbitro
    }
}